import { createStderr, createStdout } from 'vue-command'

// 从 window 对象中解构出 adbkit 实例
const $adb = window.adbkit

/**
 * ADB 工具钩子函数
 * 该函数提供了一个封装 ADB 命令执行的异步函数
 * @param {Object} params - 包含 loading 状态的参数对象
 * @param {Ref} params.loading - 一个响应式对象，用于指示是否正在执行 ADB 命令
 * @returns {Object} 返回一个对象，该对象包含一个用于执行 ADB 命令的函数
 */
export function useAdb({ loading }) {
  /**
   * 执行 ADB 命令的异步函数
   * 该函数将 ADB 命令的输出捕获并根据情况返回 stdout 或 stderr
   * @param {Array} args - 命令行参数数组，第一个参数通常被忽略
   * @returns {Promise} 返回一个 Promise 对象，该对象解析为 ADB 命令的输出结果
   */
  const adb = async (args) => {
    // 设置 loading 状态为 true
    loading.value = true
    // 从 args 中构建命令字符串
    const command = args.slice(1).join(' ')

    let stderr
    let stdout

    try {
      // 执行 ADB 命令并捕获结果
      const res = await $adb.shell(command || 'help')

      // 分别获取标准输出和错误输出
      stdout = res?.stdout
      stderr = res?.stderr
    }
    catch (error) {
      // 捕获到错误时，构建错误信息
      stderr = error?.message || JSON.stringify(error) || 'Command failed'
    }

    // 如果有错误输出，则返回错误信息
    if (stderr) {
      return createStderr(stderr)
    }

    // 设置 loading 状态为 false
    loading.value = false

    // 返回标准输出
    return createStdout(stdout)
  }

  // 返回包含 adb 函数的对象
  return {
    adb,
  }
}
